/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package co.edu.distribuidos.interfaz;

import co.edu.distribuidos.mundo.Archivo;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.border.TitledBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

/**
 *
 * @author alvar-go@uniandes.edu.co
 */
public class PanelCompartidos extends JPanel implements ActionListener, MouseListener, TreeSelectionListener{

    private final static String[] ENCABEZADOS = {"Nombre", "Tipo", "Origen", "Tiempo creación/descarga"};

    private final static String COMPARTIR_ARCHIVO = "Compartir archivo";

    private JButton btCompartir;

    private JTree arbolArchivos;

    private DefaultTreeModel modeloArbol;

    private JTable tablaArchivos;

    private DefaultTableModel modeloTabla;

    private InterfazSistemaDocs principal;

    public PanelCompartidos(InterfazSistemaDocs interfaz){
        setLayout( new BorderLayout());
        principal = interfaz;

        modeloTabla = new ModeloTablas(ENCABEZADOS, 0);
        tablaArchivos = new JTable();
        tablaArchivos.setName("Tabla archivos");
        tablaArchivos.addMouseListener(this);
        tablaArchivos.setModel(modeloTabla);
        JScrollPane scrollTabla = new JScrollPane(tablaArchivos);
        scrollTabla.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollTabla.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollTabla.setBorder( new TitledBorder("Información"));
        add(scrollTabla, BorderLayout.CENTER);

        JPanel panelIzquierda = new JPanel(new BorderLayout());
        panelIzquierda.setBorder(  new TitledBorder("Archivos") );

        DefaultMutableTreeNode raiz = new DefaultMutableTreeNode("Compartidos");
        modeloArbol = new DefaultTreeModel(raiz);
        arbolArchivos = new JTree(modeloArbol);
        arbolArchivos.setName("Arbol archivos");
        arbolArchivos.addTreeSelectionListener(this);
        JScrollPane scrollArbol = new JScrollPane(arbolArchivos);
        scrollArbol.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollArbol.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        panelIzquierda.add(scrollArbol, BorderLayout.CENTER);

        btCompartir = new JButton(COMPARTIR_ARCHIVO);
        btCompartir.setActionCommand(COMPARTIR_ARCHIVO);
        btCompartir.addActionListener(this);
        panelIzquierda.add(btCompartir, BorderLayout.SOUTH);

        add(panelIzquierda, BorderLayout.WEST);
    }

    public void actualizarArbol(String[] tipos, ArrayList<ArrayList<Archivo>> archivos){
       DefaultMutableTreeNode raiz = new DefaultMutableTreeNode("Compartidos");
       for( int  i = 0; i < tipos.length; i++){
           DefaultMutableTreeNode tipo = new DefaultMutableTreeNode(tipos[i]);
           ArrayList<Archivo> lista = archivos.get(i);
           for( int j = 0; j < lista.size(); j++){
               DefaultMutableTreeNode archivo = new DefaultMutableTreeNode(lista.get(j));
               tipo.add(archivo);
           }
           raiz.add(tipo);
       }
       modeloArbol = new DefaultTreeModel(raiz);
       arbolArchivos.setModel(modeloArbol);
       arbolArchivos.setSelectionRow(0);
       actualziarTabla(null);
    }

    public void actualziarTabla(ArrayList<Archivo> archivos){
        modeloTabla = new ModeloTablas(ENCABEZADOS, 0);
        if( archivos != null){
            String[] fila;
            for( int i = 0; i < archivos.size(); i++){
                Archivo actual = archivos.get(i);
                fila = new String[4];
                fila[0] = actual.darNombre();
                fila[1] = actual.darExtension();
                fila[2] = actual.darPropietario();
                fila[3] = actual.darFechaCreacion().toString();
                modeloTabla.addRow(fila);
            }
        }
        tablaArchivos.setModel(modeloTabla);
    }

    public void actionPerformed(ActionEvent e) {
        String comando = e.getActionCommand();
        if(comando.equals(COMPARTIR_ARCHIVO)){
            principal.compartir();
        }
    }

    public void mouseClicked(MouseEvent e) {
       String componente = e.getComponent().getName();
       int clicks = e.getClickCount();
       System.out.println("Entro aca");
       if(componente.equals(tablaArchivos.getName())){
           if(clicks == 2){
                try {
                    //Abrir el archivo
                } catch (Exception ex) {
                   ex.printStackTrace();
                }
           }
       }
    }

    public void mousePressed(MouseEvent e) {
       //
    }

    public void mouseReleased(MouseEvent e) {
        //
    }

    public void mouseEntered(MouseEvent e) {
       //
    }

    public void mouseExited(MouseEvent e) {
       //
    }

    public void valueChanged(TreeSelectionEvent e) {
        TreePath camino = e.getPath();
        DefaultMutableTreeNode nodo = (DefaultMutableTreeNode)camino.getLastPathComponent();
        Object contenido = nodo.getUserObject();
        if( nodo.getLevel() == 0 ){
            actualziarTabla(null);
        }
        else if( nodo.isLeaf() && contenido instanceof Archivo){
            ArrayList<Archivo> archivos = new ArrayList<Archivo>();
            archivos.add((Archivo)contenido);
            actualziarTabla(archivos);
        }
        else {
            actualziarTabla(principal.darArchivosTipo((String)contenido));
        }
    }
}
